1 : <?php
2 : /*--------------------------------------------------------------------------+
3 : This file is part of eStudy.
4 : calendar/class.calendar.inc.php
5 : - Modulgruppe: Calendar
6 : - Beschreibung: Klasse für Gruppenzeitenverwaltung
7 : - Version: $Id: class.grouptimesorganisation.inc.php,v 1.4.20.3 2007/12/19 23:10:04 commana Exp $
8 : - Autor(en): Corinna Kropf <corinna_kropf@web.de>,
9 : Michel Kraemer <michel.kraemer@mni.fh-giessen.de>
10 : Nadja Kruemmel <nadja@kruemmel.info>
11 : +---------------------------------------------------------------------------+
12 : This program is free software; you can redistribute it and/or
13 : modify it under the terms of the GNU General Public License
14 : as published by the Free Software Foundation; either version 2
15 : of the License, or any later version.
16 : +---------------------------------------------------------------------------+
17 : This program is distributed in the hope that it will be useful,
18 : but WITHOUT ANY WARRANTY; without even the implied warranty of
19 : MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20 : GNU General Public License for more details.
21 : You should have received a copy of the GNU General Public License
22 : along with this program; if not, write to the Free Software
23 : Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
24 : +--------------------------------------------------------------------------*/
25 : require_once (PATH_TO_ROOT."calendar/classes/class.template.inc.php");
26 : /**
27 : * Klasse zur Verwaltung des Kalenders
28 : * @package eStudy.Calendar
29 : * @author Corinna Kropf <corinna_kropf@web.de>
30 : * @author Michel Kraemer <michel.kraemer@mni.fh-giessen.de>
31 : * @author Nadja Kruemmel <nadja@kruemmel.info>
32 : * @version $Id: class.grouptimesorganisation.inc.php,v 1.4.20.3 2007/12/19 23:10:04 commana Exp $
33 : */
34 : class GrouptimesOrganisation {
35 : private $templates = array();
36 : private $a_daynames = array();
37 : /**
38 : * Konstruktor
39 : */
40 : public function GrouptimesOrganisation() {
41 6 : $this->templates = array('grouptimeblockdelete' => new Template(PATH_TO_ROOT."calendar/templates/grouptimeblockdelete.html"), 'grouptimes' => new Template(PATH_TO_ROOT."calendar/templates/grouptimes.html"), 'grouptimesaddblock' => new Template(PATH_TO_ROOT."calendar/templates/grouptimesaddblock.html"), 'grouptimeseditblock' => new Template(PATH_TO_ROOT."calendar/templates/grouptimeseditblock.html"));
42 6 : global $navpath;
43 6 : $navpath = 'Kalender';
44 6 : $this->a_daynames = array(1 => 'Montag', 2 => 'Dienstag', 3 => 'Mittwoch', 4 => 'Donnerstag', 5 => 'Freitag', 6 => 'Samstag', 7 => 'Sonntag');
45 6 : }
46 : /**
47 : * Pruefe, ob der Benutzer die Rechte hat, den Kalender zu bearbeiten,
48 : * d.h. ob er in der Gruppe ist und die Rechte hat
49 : * @access private
50 : * @param groupId ID des Events
51 : * @param kindOfGroup Typ der Gruppe: 0 für einen Kurs, 1 für ein Team
52 : * @return Fehlermeldung, wenn ein Fehler aufgetreten ist
53 : */
54 : private function checkRights($groupId, $kindOfGroup) {
55 : // prüfen, ob es diesen Kurs/dieses Team überhaupt gibt
56 0 : if($kindOfGroup == 0) {
57 0 : $result = mysql_query("SELECT * FROM courses
58 0 : WHERE ID='".Data::toMysql($groupId)."'");
59 0 : }
60 0 : else if($kindOfGroup == 1) {
61 0 : $result = mysql_query("SELECT * FROM teams
62 0 : WHERE id='".Data::toMysql($groupId)."'");
63 0 : }
64 : // Kurs/Team existiert
65 0 : if(isset($result) && mysql_num_rows($result) > 0) {
66 : // Admin darf alles
67 0 : if ($_SESSION['usergroup'] == ADMIN) {
68 0 : return;
69 : }
70 : else {
71 : // Kurs => prüfen ob der User Dozent des Kurses ist
72 0 : if($kindOfGroup == 0) {
73 0 : $docents = Course::getParticipants((int)$groupId, "teacher");
74 0 : foreach($docents as $docent) {
75 0 : if ($docent->userid == $_SESSION['userid']) $canEdit = true;
76 0 : }
77 0 : }
78 : // Team => prüfen ob der User die entsprechenden Rechte hat
79 0 : if($kindOfGroup == 1) {
80 0 : $result = mysql_query("SELECT * FROM user_team
81 0 : WHERE team_id='".Data::toMysql($groupId)."'
82 0 : AND user_id='".Data::toMysql($_SESSION['userid'])."'
83 0 : AND editCalendar='1'");
84 0 : if (mysql_num_rows($result) > 0) {
85 0 : $canEdit = true;
86 0 : }
87 0 : }
88 0 : if (!isset($canEdit) || $canEdit == false) {
89 0 : return "Sie haben nicht genügend Rechte, um die Gruppenzeiten für diese Gruppe zu bearbeiten!";
90 : }
91 : }
92 0 : }
93 0 : if (!isset($canEdit) || $canEdit == false) {
94 0 : return "Diese Gruppe existiert nicht!";
95 : }
96 0 : }
97 : /**
98 : * Zeigt die Uebersicht der Gruppenzeiten fuer den Kurs/das Team inklusive edit-Funktionen an
99 : * @access public
100 : * @param groupID ID des Kurses/Teams
101 : * @param grouptype gibt an, ob die Gruppe ein Kurs oder ein Team ist
102 : */
103 : public function showGrouptimes($groupID, $grouptype) {
104 0 : $errMsg = $this->checkRights($groupID, $grouptype);
105 0 : if(isset($errMsg))
106 0 : Functions::message_redirect($errMsg, "calendar.php");
107 : else {
108 0 : $a_errmsg = array();
109 : //Link für neuen Gruppenzeitblock
110 0 : $addTimeBlock = "<a href='grouptimesorganisation.php?action=addGrouptimeBlock&groupID=$groupID&grouptype=$grouptype'>Neu</a>";
111 : //Name des Kurses (und Teams)
112 0 : if ($grouptype == 0) {
113 : //alle Zeitblöcke aus der DB lesen
114 0 : $a_times = array();
115 0 : $r_times = Functions::forum_query("SELECT * FROM calendar_frame f, calendar_frame_courses c
116 0 : WHERE c.coursesID='".Data::toMysql($groupID)."'
117 : AND c.frameID=f.ID
118 0 : ORDER BY f.startday, f.starttime");
119 0 : $error = mysql_error();
120 : if($error)
121 0 : $a_errmsg[] = $error;
122 : else {
123 0 : if ($groupID == 0) {
124 0 : $group = 'das Foyer';
125 0 : } else {
126 0 : $coursename = Functions::forum_query("SELECT Name FROM courses WHERE ID='".Data::toMysql($groupID)."'");
127 0 : $row = mysql_fetch_array($coursename);
128 0 : $group = 'den Kurs '.Data::toHTML($row['Name']);
129 : }
130 : }
131 0 : } else {
132 : //alle Zeitblöcke aus der DB lesen
133 0 : $a_times = array();
134 0 : $r_times = Functions::forum_query("SELECT * FROM calendar_frame f, calendar_frame_teams t
135 0 : WHERE t.teamsID='".Data::toMysql($groupID)."'
136 : AND t.frameID=f.ID
137 0 : ORDER BY f.startday, f.starttime");
138 0 : $error = mysql_error();
139 : if($error)
140 0 : $a_errmsg[] = $error;
141 : else {
142 0 : $r_team = Functions::forum_query("SELECT name, course_id FROM teams WHERE id='".Data::toMysql($groupID)."'");
143 0 : $team = mysql_fetch_array($r_team);
144 0 : $coursename = Functions::forum_query("SELECT Name FROM courses WHERE ID='".Data::toMysql($team['course_id'])."'");
145 0 : $group = 'das Team '.Data::toHTML($team['name'])." ( Kurs ".Data::toHTML(mysql_result($coursename, 0)) ." )";
146 : }
147 : }
148 0 : if (array_count_values($a_errmsg)) {
149 0 : echo "<br/><br/><table width='100%' style='text-align: center;'>";
150 0 : Output::errorMessage('Folgende Fehler sind aufgetreten:<br/>'.Data::toHTML(implode($a_errmsg, '<br/>')) .'<br/>Gehen Sie mit dem Zurück-Button Ihres Browsers zur vorherigen Seite, um die Angaben zu korrigieren.');
151 0 : echo "</table><br/><br/>";
152 0 : }
153 : else {
154 0 : $a_times = array();
155 0 : while ($time = mysql_fetch_array($r_times)) {
156 0 : $a_times[][] = $time;
157 0 : }
158 0 : $times = '<tr>';
159 0 : for ($i = 1 ; $i <= 7 ; $i++) {
160 0 : $timeBlocks = "";
161 0 : foreach($a_times as $t_times) {
162 0 : foreach($t_times as $time) {
163 0 : $startday = Data::toHTML($time['startday']);
164 0 : $starttime = substr(Data::toHTML($time['starttime']), 0, 5);
165 0 : $endday = Data::toHTML($time['endday']);
166 0 : $endtime = substr(Data::toHTML($time['endtime']), 0, 5);
167 0 : if (($startday) == $i) {
168 0 : if($startday != $endday)
169 0 : $timeBlocks .= "<div class='calendarEntry' style='color: #000000;text-align:center;margin:5%;padding-top:5%;padding-bottom:5%;'>";
170 : else
171 0 : $timeBlocks.= " <div class='calendarEntry' style='color: #000000;text-align:center;margin:5%;padding-top:5%;padding-bottom:5%;'>";
172 0 : $timeBlocks .= "von ".$starttime;
173 0 : if($startday != $endday)
174 0 : $timeBlocks .= "</div>";
175 0 : }
176 0 : if ($i > $startday && $i < $endday) {
177 0 : $timeBlocks.= "<div class='calendarEntry' style='margin:5%'></div>";
178 0 : }
179 0 : if ($endday == $i) {
180 0 : if($startday != $endday)
181 0 : $timeBlocks .= "<div class='calendarEntry' style='margin:5%;padding-top:5%;padding-bottom:5%;'>";
182 0 : $timeBlocks.= "<div style='color: #000000;text-align:center;margin:5%;'>"."<a href=\"grouptimesorganisation.php?action=editGrouptimeBlock&event=".Data::toHTML($time['ID'])."&groupID=$groupID&grouptype=$grouptype\" title='Gruppenzeit bearbeiten'>".Output::getIcon('icon_edit', 'Gruppenzeit bearbeiten') ."</a>"."<a href=\"#\" onclick=\"javascript:deleteOK($time[ID], $groupID, $grouptype, true);\" title='Gruppenzeit löschen'>".Output::getIcon('icon_delete', 'Gruppenzeit löschen') ."</a></div>"."<div style='color: #000000;text-align:center;margin:5%'>"."bis ".$endtime."</div></div>";
183 0 : }
184 0 : }
185 0 : }
186 0 : $times.= '<td valign="top" class="calendarEntry">'.$timeBlocks.'</td>';
187 0 : }
188 0 : $times.= "</tr>\n";
189 0 : eval($this->templates['grouptimes']->GetTemplate());
190 0 : eval($this->templates['grouptimeblockdelete']->GetTemplate());
191 : }
192 : }
193 0 : }
194 : /**
195 : * Zeigt Formular zum Aendern eines Gruppenzeitblocks an
196 : * @access public
197 : * @param event ID des zu aendernden Gruppenzeitblock
198 : * @param groupID ID des Kurses/Teams, für das der Gruppenzeitblock eingetragen ist
199 : * @param grouptype gibt an, ob die Gruppe ein Kurs oder ein Team ist
200 : */
201 : public function editGrouptimeBlock($event, $groupID, $grouptype) {
202 0 : $errMsg = $this->checkRights($groupID, $grouptype);
203 0 : if(isset($errMsg))
204 0 : Functions::message_redirect($errMsg, "calendar.php");
205 : else {
206 0 : if ($grouptype == 0) {
207 0 : $r_event = mysql_query("SELECT * FROM calendar_frame f, calendar_frame_courses c
208 0 : WHERE f.ID='".Data::toMysql($event)."'
209 : AND f.ID=c.frameID
210 0 : AND c.coursesID='".Data::toMysql($groupID)."'");
211 0 : } else {
212 0 : $r_event = mysql_query("SELECT * FROM calendar_frame f, calendar_frame_teams t
213 0 : WHERE f.ID='".Data::toMysql($event)."'
214 : AND f.ID=t.frameID
215 0 : AND t.teamsID='".Data::toMysql($groupID)."'");
216 : }
217 0 : $error = mysql_error();
218 0 : if($error) {
219 0 : echo "<br/><br/><table width='100%' style='text-align: center;'>";
220 0 : Output::errorMessage('Folgende Fehler sind aufgetreten:<br/>'.Data::toHTML($error).'<br/>Gehen Sie mit dem Zurück-Button Ihres Browsers zur vorherigen Seite, um die Angaben zu korrigieren.');
221 0 : echo "</table><br/><br/>";
222 0 : }
223 : else {
224 0 : $timeBlock = mysql_fetch_array($r_event);
225 0 : $startday = $timeBlock['startday'];
226 0 : $endday = $timeBlock['endday'];
227 : //Stunden und Minuten separieren
228 0 : $starttime = array(0 => substr($timeBlock['starttime'], 0, 2), 1 => substr($timeBlock['starttime'], 3, 2),);
229 0 : $endtime = array(0 => substr($timeBlock['endtime'], 0, 2), 1 => substr($timeBlock['endtime'], 3, 2),);
230 : //Auswahlbox mit dem aktellen Starttag/Endtag
231 0 : $startdayform = '<select name="newtime[startday]" class="tbselect">';
232 0 : for ($i = 1 ; $i <= 7 ; $i++) {
233 0 : $startdayform.= '<option value="'.$i.'"'.($i == $startday ? ' selected="selected"' : '') .'>'.$this->a_daynames[$i].'</option>';
234 0 : }
235 0 : $startdayform.= '</select>';
236 0 : $enddayform = '<select name="newtime[endday]" class="tbselect">';
237 0 : for ($i = 1 ; $i <= 7 ; $i++) {
238 0 : $enddayform.= '<option value="'.$i.'"'.($i == $endday ? ' selected="selected"' : '') .'>'.$this->a_daynames[$i].'</option>';
239 0 : }
240 0 : $enddayform.= '</select>';
241 0 : eval($this->templates['grouptimeseditblock']->GetTemplate());
242 : }
243 : }
244 0 : }
245 : /**
246 : * Änderungen für einen Gruppenzeitblock übernehmen
247 : * @access public
248 : * @param event zu aendernde Daten für den Gruppenzeitblock
249 : * @param groupID ID des Kurses/Teams, für das der Gruppenzeitblock eingetragen ist
250 : * @param grouptype gibt an, ob die Gruppe ein Kurs oder ein Team ist
251 : */
252 : public function saveEditedGrouptimeBlock($event, $groupID, $grouptype) {
253 0 : $errMsg = $this->checkRights($groupID, $grouptype);
254 0 : if(isset($errMsg))
255 0 : Functions::message_redirect($errMsg, "calendar.php");
256 : else {
257 0 : $a_errmsg = array();
258 : //falls nötig der Stunde / Minute eine 0 voranstellen
259 0 : if (strlen($event['starthour']) != 2) $event['starthour'] = '0'.$event['starthour'];
260 0 : if (strlen($event['startmin']) != 2) $event['startmin'] = '0'.$event['startmin'];
261 0 : if (strlen($event['endhour']) != 2) $event['endhour'] = '0'.$event['endhour'];
262 0 : if (strlen($event['endmin']) != 2) $event['endmin'] = '0'.$event['endmin'];
263 0 : $starttime = $event['starthour'].":".$event['startmin'];
264 0 : if (!is_numeric($event['starthour']) || !is_numeric($event['startmin']) || !($event['starthour'] >= 0 && $event['starthour'] <= 23) || !($event['startmin'] >= 0 && $event['startmin'] <= 59)) {
265 0 : $a_errmsg[] = 'Sie haben eine ungültige Startzeit angegeben.';
266 0 : }
267 0 : $endtime = $event['endhour'].":".$event['endmin'];
268 0 : if (!is_numeric($event['endhour']) || !is_numeric($event['endmin']) || !($event['endhour'] >= 0 && $event['endhour'] <= 23) || !($event['endmin'] >= 0 && $event['endmin'] <= 59)) {
269 0 : $a_errmsg[] = 'Sie haben eine ungültige Endzeit angegeben.';
270 0 : }
271 0 : if (array_count_values($a_errmsg)) {
272 0 : echo "<br/><br/><table width='100%' style='text-align: center;'>";
273 0 : Output::errorMessage('Folgende Fehler sind bei der Eingabe aufgetreten:<br/>'.Data::toHTML(implode($a_errmsg, '<br/>')) .'<br/>Gehen Sie mit dem Zurück-Button Ihres Browsers zur vorherigen Seite, um die Angaben zu korrigieren.');
274 0 : echo "</table><br/><br/>";
275 0 : } else {
276 : //prüfen, ob der block sich evtl. mit einem vorhandenen eintrag überschneidet
277 0 : if ($grouptype == 0) {
278 : $sql = ("SELECT f.* FROM calendar_frame f, calendar_frame_courses g
279 0 : WHERE g.coursesID='".Data::toMysql($groupID)."'
280 0 : AND g.frameID=f.ID");
281 0 : } else {
282 : $sql = ("SELECT f.* FROM calendar_frame f, calendar_frame_teams g
283 0 : WHERE g.teamsID='".Data::toMysql($groupID)."'
284 0 : AND g.frameID=f.ID");
285 : }
286 0 : $r_events = Functions::forum_query($sql);
287 0 : $error = mysql_error();
288 0 : if($error) {
289 0 : echo "<br/><br/><table width='100%' style='text-align: center;'>";
290 0 : Output::errorMessage('Folgende Fehler sind aufgetreten:<br/>'.Data::toHTML($error).'<br/>Gehen Sie mit dem Zurück-Button Ihres Browsers zur vorherigen Seite, um die Angaben zu korrigieren.');
291 0 : echo "</table><br/><br/>";
292 0 : }
293 : else {
294 0 : $newvalues = array('ID' => Data::toHTML($event['ID']), 'startday' => Data::toHTML($event['startday']), 'starttime' => Data::toHTML($starttime) .":00", 'endday' => Data::toHTML($event['endday']), 'endtime' => Data::toHTML($endtime) .":00");
295 0 : $res = $this->combineBlocks($r_events, $newvalues);
296 0 : if (!isset($res)) {
297 0 : $sql = "DELETE FROM calendar_frame WHERE ID='".Data::toMysql($newvalues['ID'])."'";
298 0 : Functions::forum_query($sql);
299 0 : Functions::message_redirect("Update erfolgreich", "grouptimesorganisation.php?groupID=$groupID&grouptype=$grouptype");
300 0 : } else {
301 0 : $concurrentIDs = $res['concurrentIDs'];
302 0 : $newvalues = $res['newvalues'];
303 0 : if (count($concurrentIDs) == 0) {
304 0 : mysql_query("UPDATE calendar_frame SET "."startday = '".Data::toMysql($event['startday']) ."', endday = '".Data::toMysql($event['endday']) ."', starttime = '".Data::toMysql($starttime)."', endtime = '".Data::toMysql($endtime)."' "."WHERE ID = '".Data::toMysql($event['ID'])."'");
305 0 : Functions::message_redirect("Update erfolgreich", "grouptimesorganisation.php?groupID=$groupID&grouptype=$grouptype");
306 0 : } else {
307 : //starte transaktion
308 0 : $sql = "BEGIN";
309 0 : Functions::forum_query($sql);
310 : //den eintrag mit der ersten id auf die neuen werte ändern,
311 0 : $idToChange = $event['ID'];
312 0 : $sql = "UPDATE calendar_frame SET"." startday='".Data::toMysql($newvalues['startday']) ."'".", endday='".Data::toMysql($newvalues['endday']) ."'".", starttime='".Data::toMysql($newvalues['starttime']) ."'".", endtime='".Data::toMysql($newvalues['endtime']) ."'"." WHERE ID='".Data::toMysql($idToChange)."'";
313 0 : Functions::forum_query($sql);
314 : //alle andere anderen IDs in $concurrentIDs[] ist löschen
315 0 : for ($i = 0 ; $i < count($concurrentIDs) ; $i++) {
316 0 : $id = $concurrentIDs[$i];
317 0 : $sql = "DELETE FROM calendar_frame WHERE ID='".Data::toMysql($id)."'";
318 0 : Functions::forum_query($sql);
319 0 : if ($grouptype == 0) $sql = "DELETE FROM calendar_frame_courses WHERE frameID='".Data::toMysql($id)."'";
320 0 : else $sql = "DELETE FROM calendar_frame_teams WHERE frameID='".Data::toMysql($id)."'";
321 0 : Functions::forum_query($sql);
322 0 : }
323 : //beende transaktion
324 0 : $sql = "COMMIT";
325 0 : Functions::forum_query($sql);
326 0 : Functions::message_redirect("Die Zeit überschneidet sich mit bereits vorhandenen Einträgen, diese werden kombiniert.<br/>", "grouptimesorganisation.php?groupID=$groupID&grouptype=$grouptype");
327 : }
328 : }
329 : }
330 : }
331 : }
332 0 : }
333 : /**
334 : * Zeigt Formular zum Eintragen eines neuen Gruppenzeitblocks an
335 : * @access public
336 : * @param groupID ID des Kurses/Teams, für das der Gruppenzeitblock definiert werden soll
337 : * @param grouptype gibt an, ob die Gruppe ein Kurs oder ein Team ist
338 : */
339 : public function addGrouptimeBlock($groupID, $grouptype) {
340 0 : $errMsg = $this->checkRights($groupID, $grouptype);
341 0 : if(isset($errMsg))
342 0 : Functions::message_redirect($errMsg, "calendar.php");
343 : else {
344 : //default-werte
345 0 : $event['starthour'] = '00';
346 0 : $event['startmin'] = '00';
347 0 : $event['endhour'] = '23';
348 0 : $event['endmin'] = '59';
349 0 : $t_action = "grouptimesorganisation.php?action=do_addGrouptimeBlock&groupID=$groupID&grouptype=$grouptype";
350 0 : eval($this->templates['grouptimesaddblock']->GetTemplate());
351 : }
352 0 : }
353 : /**
354 : * Traegt den neuen Gruppenzeitblock in DB ein
355 : * @access public
356 : * @param event Daten des neuen Gruppenzeitblocks
357 : * @param groupID ID des Kurses/Teams, für das der Gruppenzeitblock definiert werden soll
358 : * @param grouptype gibt an, ob die Gruppe ein Kurs oder ein Team ist
359 : */
360 : public function do_addGrouptimeBlock($event, $groupID, $grouptype) {
361 0 : $errMsg = $this->checkRights($groupID, $grouptype);
362 0 : if(isset($errMsg))
363 0 : Functions::message_redirect($errMsg, "calendar.php");
364 : else {
365 0 : $a_errmsg = array();
366 : //default-werte
367 0 : if (!isset($event['startday'])) $event['startday'] = 1;
368 0 : if (!isset($event['starthour'])) $event['starthour'] = 0;
369 0 : if (!isset($event['startmin'])) $event['startmin'] = 0;
370 0 : if (!isset($event['endday'])) $event['endday'] = 7;
371 0 : if (!isset($event['endhour'])) $event['endhour'] = 23;
372 0 : if (!isset($event['endmin'])) $event['endmin'] = 59;
373 : //falls nötig der Stunde / Minute eine 0 voranstellen
374 0 : if (strlen($event['starthour']) != 2) $event['starthour'] = '0'.$event['starthour'];
375 0 : if (strlen($event['startmin']) != 2) $event['startmin'] = '0'.$event['startmin'];
376 0 : if (strlen($event['endhour']) != 2) $event['endhour'] = '0'.$event['endhour'];
377 0 : if (strlen($event['endmin']) != 2) $event['endmin'] = '0'.$event['endmin'];
378 0 : if ($event['startday'] == 0) $a_errmsg[] = 'Sie haben keinen Start-Wochentag angegeben.';
379 0 : if ($event['endday'] == 0) $a_errmsg[] = 'Sie haben keinen End-Wochentag angegeben.';
380 0 : $starttime = $event['starthour'].":".$event['startmin'].":00";
381 0 : if (!is_numeric($event['starthour']) || !is_numeric($event['startmin']) || !($event['starthour'] >= 0 && $event['starthour'] <= 23) || !($event['startmin'] >= 0 && $event['startmin'] <= 59)) {
382 0 : $a_errmsg[] = 'Sie haben eine ungültige Startzeit angegeben.';
383 0 : }
384 0 : $endtime = $event['endhour'].":".$event['endmin'].":00";
385 0 : if (!is_numeric($event['endhour']) || !is_numeric($event['endmin']) || !($event['endhour'] >= 0 && $event['endhour'] <= 23) || !($event['endmin'] >= 0 && $event['endmin'] <= 59)) {
386 0 : $a_errmsg[] = 'Sie haben eine ungültige Endzeit angegeben.';
387 0 : }
388 0 : if (array_count_values($a_errmsg)) {
389 0 : echo "<br/><br/><table width='100%' style='text-align: center;'>";
390 0 : Output::errorMessage('Folgende Fehler sind bei der Eingabe aufgetreten:<br/>'.Data::toHTML(implode($a_errmsg, '<br/>')) .'<br/>Gehen Sie mit dem Zurück-Button Ihres Browsers zur vorherigen Seite, um die Angaben zu korrigieren.');
391 0 : echo "</table><br/><br/>";
392 0 : } else {
393 : //prüfen, ob der block sich evtl. mit einem vorhandenen eintrag überschneidet
394 0 : if ($grouptype == 0) {
395 : $sql = ("SELECT f.* FROM calendar_frame f, calendar_frame_courses g
396 0 : WHERE g.coursesID='".Data::toMysql($groupID)."'
397 0 : AND g.frameID=f.ID");
398 0 : } else {
399 : $sql = ("SELECT f.* FROM calendar_frame f, calendar_frame_teams g
400 0 : WHERE g.teamsID='".Data::toMysql($groupID)."'
401 0 : AND g.frameID=f.ID");
402 : }
403 0 : $r_events = Functions::forum_query($sql);
404 0 : $error = mysql_error();
405 0 : if($error) {
406 0 : echo "<br/><br/><table width='100%' style='text-align: center;'>";
407 0 : Output::errorMessage('Folgende Fehler sind aufgetreten:<br/>'.Data::toHTML($error).'<br/>Gehen Sie mit dem Zurück-Button Ihres Browsers zur vorherigen Seite, um die Angaben zu korrigieren.');
408 0 : echo "</table><br/><br/>";
409 0 : }
410 : else {
411 0 : $newvalues = array('startday' => Data::toHTML($event['startday']), 'starttime' => Data::toHTML($starttime), 'endday' => Data::toHTML($event['endday']), 'endtime' => Data::toHTML($endtime));
412 0 : $res = $this->combineBlocks($r_events, $newvalues);
413 0 : if (!isset($res)) {
414 0 : Functions::message_redirect("Kein Update nötig, die Werte liegen innerhalb eines vorhandenen Gruppenzeitblocks", "grouptimesorganisation.php?groupID=$groupID&grouptype=$grouptype");
415 0 : } else {
416 0 : $concurrentIDs = $res['concurrentIDs'];
417 0 : $newvalues = $res['newvalues'];
418 0 : if (count($concurrentIDs) == 0) {
419 : //keine überlappenden einträge => neuen eintrag machen mit $newvalues
420 : //starte transaktion
421 0 : $sql = "BEGIN";
422 0 : Functions::forum_query($sql);
423 : //füge gruppenzeiteintrag hinzu
424 0 : $sql = ("INSERT INTO calendar_frame (startday,endday,starttime,endtime) VALUES ('".Data::toMysql($event['startday'])."','".Data::toMysql($event['endday'])."','".Data::toMysql($starttime)."','".Data::toMysql($endtime)."');");
425 0 : Functions::forum_query($sql);
426 : //hole neue id
427 0 : $newFrameID = mysql_insert_id();
428 0 : if ($grouptype == 0) $sql = ("INSERT INTO calendar_frame_courses (coursesID, frameID) VALUES ('".Data::toMysql($groupID)."','".Data::toMysql($newFrameID)."')");
429 0 : else $sql = ("INSERT INTO calendar_frame_teams (teamsID, frameID) VALUES ('".Data::toMysql($groupID)."','".Data::toMysql($newFrameID)."')");
430 0 : Functions::forum_query($sql);
431 : //beende transaktion
432 0 : $sql = "COMMIT";
433 0 : Functions::forum_query($sql);
434 0 : Functions::message_redirect("Eintrag erfolgreich", "grouptimesorganisation.php?groupID=$groupID&grouptype=$grouptype");
435 0 : } else {
436 : //starte transaktion
437 0 : $sql = "BEGIN";
438 0 : Functions::forum_query($sql);
439 : //den eintrag mit der ersten id auf die neuen werte ändern,
440 0 : $idToChange = $concurrentIDs[0];
441 0 : $sql = "UPDATE calendar_frame SET"." startday='".Data::toMysql($newvalues['startday']) ."'".", endday='".Data::toMysql($newvalues['endday']) ."'".", starttime='".Data::toMysql($newvalues['starttime']) ."'".", endtime='".Data::toMysql($newvalues['endtime']) ."'"." WHERE ID='".Data::toMysql($idToChange)."'";
442 0 : Functions::forum_query($sql);
443 : //alle andere anderen IDs in $concurrentIDs[] ist löschen
444 0 : for ($i = 1 ; $i < count($concurrentIDs) ; $i++) {
445 0 : $id = $concurrentIDs[$i];
446 0 : if ($id == $idToChange) continue;
447 0 : $sql = "DELETE FROM calendar_frame WHERE ID='".Data::toMysql($id)."'";
448 0 : Functions::forum_query($sql);
449 0 : if ($grouptype == 0) $sql = "DELETE FROM calendar_frame_courses WHERE frameID='".Data::toMysql($id)."'";
450 0 : else $sql = "DELETE FROM calendar_frame_teams WHERE frameID='".Data::toMysql($id)."'";
451 0 : Functions::forum_query($sql);
452 0 : }
453 : //beende transaktion
454 0 : $sql = "COMMIT";
455 0 : Functions::forum_query($sql);
456 0 : Functions::message_redirect("Die Zeit überschneidet sich mit bereits vorhandenen Einträgen, diese werden kombiniert.<br/>", "grouptimesorganisation.php?groupID=$groupID&grouptype=$grouptype");
457 : }
458 : }
459 : }
460 : }
461 : }
462 0 : }
463 : /**
464 : * Prueft, ob der neu einzutragende Gruppenzeitblock sich mit einem oder mehreren
465 : * vorhandenen Eintraegen dieser Gruppe überschneidet.
466 : * @access private
467 : * @param $r_events SQL-Array mit allen Gruppenzeit-Eintraegen dieses Kurses/Teams
468 : * @param $newvalues die Werte, die der User im Edit-Formular angegeben hat
469 : * @return Array mit: Liste der Werte, die Eingetragen werden müssen:
470 : * Die uebergebenen Werte, wenn sie sich mit keinem vorhandenen
471 : * Block ueberschneiden, sonst die neuen Werte
472 : * Liste der IDs derjenigen Bloecke, mit denen sich die neuen Werte ueberschneiden
473 : */
474 : private function combineBlocks($r_events, $newvalues) {
475 0 : $startday = $newvalues['startday'];
476 0 : $starttime = mktime(intval(substr($newvalues['starttime'], 0, 2)), intval(substr($newvalues['starttime'], 3, 2)), intval(substr($newvalues['starttime'], 6, 2))); //$newvalues['starttime'];
477 0 : $endday = $newvalues['endday'];
478 0 : $endtime = mktime(intval(substr($newvalues['endtime'], 0, 2)), intval(substr($newvalues['endtime'], 3, 2)), intval(substr($newvalues['endtime'], 6, 2))); //$newvalues['endtime'];
479 0 : if ($startday > $endday) {
480 0 : $endday+= 7;
481 0 : }
482 0 : $concurrentIDs = array();
483 0 : $i = 0;
484 0 : while ($e_event = mysql_fetch_array($r_events)) {
485 0 : if (isset($newvalues['ID']) && $newvalues['ID'] == $e_event['ID']) continue;
486 0 : $e_startday = $e_event['startday'];
487 0 : $e_starttime = mktime(intval(substr($e_event['starttime'], 0, 2)), intval(substr($e_event['starttime'], 3, 2)), intval(substr($e_event['starttime'], 6, 2)));
488 0 : $e_endday = $e_event['endday'];
489 0 : $e_endtime = mktime(intval(substr($e_event['endtime'], 0, 2)), intval(substr($e_event['endtime'], 3, 2)), intval(substr($e_event['endtime'], 6, 2)));
490 0 : if ($e_startday > $e_endday) {
491 0 : $e_endday+= 7;
492 0 : }
493 : //nicht betroffene einträge überspringen
494 0 : if (($startday < $e_startday && $endday < $e_startday && ($startday+7) > $e_endday) || ($startday > $e_endday && $endday > $e_endday && ($endday-7) < $e_startday) || ($startday == $endday && $startday == $e_startday && $endday == $e_endday && ($starttime > $e_endtime || $endtime < $e_starttime))) {
495 0 : continue;
496 : }
497 : //neue werte liegen komplett in einem schon vorhandenen eintrag => kein neuer eintrag nötig
498 0 : if (($startday > $e_startday || ($startday == $e_startday && $starttime >= $e_starttime)) && ($endday < $e_endday || ($endday == $e_endday && $endtime <= $e_endtime))) {
499 0 : return null;
500 : }
501 0 : $concurrentIDs[$i++] = $e_event['ID']; // IDs der Einträge merken, die überdeckt werden
502 : // die zum schluss löschen
503 : //vorhandener eintrag wird von den neuen werten komplett überdeckt => diesen löschen
504 0 : if (($startday < $e_startday || ($startday == $e_startday && $starttime < $e_starttime)) && ($endday > $e_endday || ($endday == $e_endday && $endtime >= $e_endtime))) {
505 0 : continue;
506 : }
507 : //der selbe tag => wenn nötig uhrzeiten anpassen:
508 : //start
509 0 : if ($startday == $e_startday && $starttime > $e_starttime && $starttime < $e_endtime) {
510 0 : $newvalues['starttime'] = $e_event['starttime'];
511 0 : }
512 : //ende
513 0 : if ($endday == $e_endday && $endtime < $e_endtime) {
514 0 : $newvalues['endtime'] = $e_event['endtime'];
515 0 : }
516 : //neue werte überlappen => wenn nötig tage anpassen:
517 : //davor
518 0 : if ($startday < $e_startday && $endtime < $e_endday) {
519 0 : $newvalues['endtime'] = $e_event['endday'];
520 0 : }
521 : //danach
522 0 : if ($startday > $e_startday && $endday > $e_endday) {
523 0 : $newvalues['startday'] = $e_event['startday'];
524 0 : }
525 0 : }
526 0 : $res['concurrentIDs'] = $concurrentIDs;
527 0 : $res['newvalues'] = $newvalues;
528 0 : return $res;
529 : }
530 : /**
531 : * Loescht einen Gruppenzeitblock aus der Datenbank
532 : * @access public
533 : * @param id frameID des Gruppenzeitblocks
534 : * @param groupID ID des Kurses/Teams, für das der Gruppenzeitblock definiert ist
535 : * @param grouptype gibt an, ob die Gruppe ein Kurs oder ein Team ist
536 : * @param do_redirect true wenn nach Ausführung der Funktion zur Gruppenzeiternuebersicht
537 : * zurueckgesprungen werden soll, false sonst
538 : */
539 : public function deleteGrouptimeBlock($id, $groupID, $grouptype, $do_redirect) {
540 0 : $errMsg = $this->checkRights($groupID, $grouptype);
541 0 : if(isset($errMsg))
542 0 : Functions::message_redirect($errMsg, "calendar.php");
543 : else {
544 0 : $del_event = mysql_query("DELETE FROM calendar_frame_teams WHERE frameID = '".Data::toMysql($id) ."'");
545 0 : $del_event = mysql_query("DELETE FROM calendar_frame WHERE ID = '".Data::toMysql($id) ."'");
546 0 : if ($do_redirect) Functions::message_redirect("Gruppenzeit wurde gelöscht", "grouptimesorganisation.php?groupID=$groupID&grouptype=$grouptype");
547 : }
548 0 : }
549 : }
550 : ?>
|